winform窗体间传值问题

a1988lourong 2014-09-18 05:26:45
现在有子窗体A和主窗体B,在A和B里分别有一个ListBox,现在要将A里面ListBox里面的值传给B里面的ListBox,具体应该怎么做呢?急!在网上查过很多资料,尝试过,还是没成功,搞不清楚到底是要怎么传?最好是给出具体的代码
...全文
486 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
我叫小菜菜 2014-09-24
  • 打赏
  • 举报
回复
引用 13 楼 sp1234 的回复:
实际上,比较专业的设计应该是,A仅仅暴露一个 ObservableCollection<> 之类的数据属性接口,而不是暴露一个 ListBox 控件。不管A内部如何用控件实现,不管如何重构,这个接口上的对外数据属性是不变的。A应该自己去在ListBox改变时去额外地改变这个属性数据。 实际上多写一点代码,有重大的设计意义。不过可能你现在只是为了凑合写个可执行程序,不太能够理解这种设计的作用,所以这里也就不多说了。
严重同意!!!!
引用 25 楼 wanghui0380 的回复:
@sp1234 看来在winform领域推广mvvm方式编码,依然是个艰巨的任务。不管怎么看,就是在我自己的团队里,依然有4成滴人坚守着古老滴vb,delphi带来滴这种手动事件驱动+脚本驱动滴方式编码,而不愿意接触一点点滴自动事件驱动滴方式编码
世界上最困难的两件事: 1.把别人口袋里的钱装入自己口袋。 2,把自己的思想塞进到别人的脑袋。
wanghui0380 2014-09-20
  • 打赏
  • 举报
回复
@sp1234 看来在winform领域推广mvvm方式编码,依然是个艰巨的任务。不管怎么看,就是在我自己的团队里,依然有4成滴人坚守着古老滴vb,delphi带来滴这种手动事件驱动+脚本驱动滴方式编码,而不愿意接触一点点滴自动事件驱动滴方式编码
elltrack 2014-09-20
  • 打赏
  • 举报
回复
慢慢来,加油吧。我以前也遇过这种问题。看细点
a1988lourong 2014-09-20
  • 打赏
  • 举报
回复
搞定了,为F_Main写的构造函数,又加了个for循环,把ListBox里面的Item一次全部传过去了,总算理解了,学会了很多东西,谢谢大家,谢谢wendys1127
threenewbee 2014-09-19
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/360140208
  • 打赏
  • 举报
回复
实际上,比较专业的设计应该是,A仅仅暴露一个 ObservableCollection<> 之类的数据属性接口,而不是暴露一个 ListBox 控件。不管A内部如何用控件实现,不管如何重构,这个接口上的对外数据属性是不变的。A应该自己去在ListBox改变时去额外地改变这个属性数据。 实际上多写一点代码,有重大的设计意义。不过可能你现在只是为了凑合写个可执行程序,不太能够理解这种设计的作用,所以这里也就不多说了。
  • 打赏
  • 举报
回复
引用 楼主 a1988lourong 的回复:
现在有子窗体A和主窗体B,在A和B里分别有一个ListBox,现在要将A里面ListBox里面的值传给B里面的ListBox,具体应该怎么做呢?急!在网上查过很多资料,尝试过,还是没成功,搞不清楚到底是要怎么传?最好是给出具体的代码
1. A可以直接暴露ListBox,例如在你的vs的窗体属性窗口中将对应的ListBox设置为public的,这样就可以从B直接访问A。 2. A是子窗体,设计的思想是“屏蔽对其它窗体的依赖关系”,也就是A中绝不访问B。A其实就是一个服务,它抛出一个“事件通知”来通知自己的宿主程序“ListBox已经改变”。你可以让你的A实现 INotifyPropertyChanged 接口,来向外界抛出属性修改的通知。 3. B在创建A的实例之后,监听此窗口的“PropertyChanged事件”。当判断此事件是通知ListBox修改的时候,就读取ListBox,并且更改自己的ListBox。 因此设计的原则是,这个“将A里面ListBox里面的值传给B里面的ListBox”根本就是不符合“低耦合”逻辑的。你应该在设计时就该为“B监听到A中ListBox修改,则自动读取A中的ListBox来更新自己的ListBox”,这个设计才更能保证你的程序将来扩展起来会干净简洁。
以夕阳落款 2014-09-19
  • 打赏
  • 举报
回复
被传值的里面写个public方法,就可以直接传值了
EdsionWang 2014-09-19
  • 打赏
  • 举报
回复
上一次看这种帖子,有人说是月经贴。这会看看,比大姨妈来的还勤快
於黾 2014-09-19
  • 打赏
  • 举报
回复
无力吐槽 网上那么多例子,你一个都看不懂 难道这里给出代码,你就能看懂了吗? 看不懂,不会先照搬下来,自己运行起来看看效果,然后改改,再看效果? 不懂,又不愿意去尝试,干看能看懂的话,你以为你是神童啊
wendys1127 2014-09-19
  • 打赏
  • 举报
回复
那个已经把只是listbox控件传到窗体二,您在窗体点击传值不可能有问题,估计代码参数还是什么写错了,还有注意,你在点击传值前,在当前窗体选择一项值,可能是这个问题。
a1988lourong 2014-09-19
  • 打赏
  • 举报
回复
private void button1_Click(object sender, EventArgs e) { lstbox1.Items.Add(lbList1.Text); //报错“未将对象引用设置到对象的实例” this.Close(); }
wendys1127 2014-09-19
  • 打赏
  • 举报
回复
--------------------------- 呃,,,代码不是这么学习的,,,,你可以copy,但是至少要理解代码啊,不是所有的参数什么照搬。。。。 --------------------- 还有,有什么问题问好了,以及你那个第二个问题 “未将对象引用设置到对象的实例” 进行什么操作,怎么报的错误,,
a1988lourong 2014-09-19
  • 打赏
  • 举报
回复
不管大神们怎么吐槽,我的内心依然很强大···· 感谢各位,wendys1127 ,用你的方法已经实现传值,谢谢 下面说明我的具体情况,直接上图上代码吧,我也不嫌丢人了,有兴趣的大神受累帮忙看下问题在哪里 在F_Main窗体里,在ComboBox选择PRI的时候,下面的ListBox里面要显示的是从F_Wizard里的ListBox里面传过来的值,我考虑的是在点击OK的时候传值,可是会报错“未将对象引用设置到对象的实例”;另外,由于在选择INI的时候,ListBox是有默认值的,不知该怎么处理,我的逻辑比较乱,求指导,求敲打···· public partial class F_Wizard : Form { public F_Wizard() { InitializeComponent(); } List<string> listP1 = new List<string>(); List<string> listP2 = new List<string>(); ListBox lstbox1; public F_Wizard(ListBox lstbox2) { lstbox1 = lstbox2; InitializeComponent(); } private void cboxP1_SelectedIndexChanged(object sender, EventArgs e) { if (cboxP1.SelectedItem.ToString() == "A01") { lbList1.Items.Clear(); listP1.Clear(); string[] strP1 = new string[] { "A0001", "A0002"}; foreach (string str in strP1) { listP1.Add(str); } } else if (cboxP1.SelectedItem.ToString() == "A02") { lbList1.Items.Clear(); listP1.Clear(); string[] strP1 = new string[] { "A0003", "A0004" }; foreach (string str in strP1) { listP1.Add(str); } } foreach (string str in listP2) { lbList1.Items.Add(str); } foreach (string str in listP1) { lbList1.Items.Add(str); } } private void cboxP2_SelectedIndexChanged(object sender, EventArgs e) { if (cboxP2.SelectedItem.ToString() == "A01") { lbList1.Items.Clear(); listP2.Clear(); string[] strP1 = new string[] { "A0001", "A0002" }; foreach (string str in strP1) { listP2.Add(str); } } else if (cboxP2.SelectedItem.ToString() == "B01") { lbList1.Items.Clear(); listP2.Clear(); string[] strP1 = new string[] { "B0003", "B0004" }; foreach (string str in strP1) { listP2.Add(str); } } foreach (string str in listP1) { lbList1.Items.Add(str); } foreach (string str in listP2) { lbList1.Items.Add(str); } } private void button1_Click(object sender, EventArgs e) { lstbox1.Items.Add(lbList1.Text); this.Close(); } } public partial class F_Main : Form { public F_Main() { InitializeComponent(); } List<string> list = new List<string>(); ListBox lbTemp; private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { if (cbox3.SelectedItem.ToString() == "INI") { lbList2.Items.Clear(); list.Clear(); string[] strP1 = new string[] { "INI0001", "INI0002" }; foreach (string str in strP1) { list.Add(str); } } else if (cbox3.SelectedItem.ToString() == "PRI") { lbList2.Items.Clear(); list.Clear(); F_Wizard FrmWizard = new F_Wizard(lbList2); } foreach (string str in list) { lbList2.Items.Add(str); } } private void F_Main_Load(object sender, EventArgs e) { F_Wizard FrmWizard = new F_Wizard(lbList2); FrmWizard.ShowDialog(); //FrmWizard.Dispose(); } }
sinat_14930079 2014-09-19
  • 打赏
  • 举报
回复
不能用窗体构造函数吗?
truediego 2014-09-18
  • 打赏
  • 举报
回复
LZ把问题想得太复杂了吧。 两个窗口,归根到底也就是两个object 传值,不就是get/set值么 根据你的实际情况,A往B里面set,或者B从A里面get,然后用就行了
exception92 2014-09-18
  • 打赏
  • 举报
回复
比猫画虎 都不会,只能说明。。。。
wendys1127 2014-09-18
  • 打赏
  • 举报
回复
--------------------------------------------------------------------
对于新手而言,,上图上代码直观,毕竟也是走过的路。。
-------------------

-----主窗体B代码
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(listBox1);
f2.ShowDialog();
}

------子窗体A代码
public Form2()
{
InitializeComponent();
}

ListBox lstbox2;
public Form2(ListBox lstbox1)
{
lstbox2 = lstbox1;
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
lstbox2.Items.Add(listBox1.Text);
}


------------------运行程序图









------------这些小问题百度都一大堆。。。。。。。。
我叫小菜菜 2014-09-18
  • 打赏
  • 举报
回复
引用 5 楼 a1988lourong 的回复:
额······我要是能看明白,能用对,就不来这里问了·······
最简单的,构造函数传值。 自定义一个类 class1,存储你要传的变量值。 在新窗体的构造函数中,把class1作为构造函数的参数。这总明白了吧。
引用 2 楼 duanzi_peng 的回复:
http://bbs.csdn.net/topics/390128592
第三种方法:用构造函数 在窗体Form2中

int value1; 
string value2; 

public Form2 ( int value1 , string value2 ) 
{ 
     InitializeComponent ( ); 

     this.value1 = value1; 
     this.value2 = value2; 
}


在窗体Form1中这样调用

new Form2 ( 111 , "222" ).Show ( ); 

这样就把111,"222",这2个值传送给了Form2 
但是这样的传值是单向的

wind_cloud2011 2014-09-18
  • 打赏
  • 举报
回复
textbox1修改为listBox1
加载更多回复(6)

110,577

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧